bitmasks brute force dp *2000

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define lb lower_bound
#define ub upper_bound
#define f first
#define s second
#define resz resize
#define sz(x) int((x).size())
#define all(x) (x).begin(), (x).end()
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)
#define sort_by(x, y)                                                          \
  sort(all(x), [&](const auto &a, const auto &b) { return y; })
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vb = vector<bool>;
using vd = vector<double>;
using vs = vector<string>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pdd = pair<double, double>;
using vpii = vector<pii>;
using vvpii = vector<vpii>;
using vpll = vector<pll>;
using vvpll = vector<vpll>;
using vpdd = vector<pdd>;
using vvpdd = vector<vpdd>;
template <typename T> void ckmin(T &a, const T &b) { a = min(a, b); }
template <typename T> void ckmax(T &a, const T &b) { a = max(a, b); }
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
namespace __input {
template <class T1, class T2> void re(pair<T1, T2> &p);
template <class T> void re(vector<T> &a);
template <class T, size_t SZ> void re(array<T, SZ> &a);
template <class T> void re(T &x) { cin >> x; }
void re(double &x) {
  string t;
  re(t);
  x = stod(t);
}
template <class Arg, class... Args> void re(Arg &first, Args &... rest) {
  re(first);
  re(rest...);
}
template <class T1, class T2> void re(pair<T1, T2> &p) { re(p.f, p.s); }
template <class T> void re(vector<T> &a) { F0R(i, sz(a)) re(a[i]); }
template <class T, size_t SZ> void re(array<T, SZ> &a) { F0R(i, SZ) re(a[i]); }
} // namespace __input
using namespace __input;
namespace __output {
template <class T1, class T2> void pr(const pair<T1, T2> &x);
template <class T, size_t SZ> void pr(const array<T, SZ> &x);
template <class T> void pr(const vector<T> &x);
template <class T> void pr(const deque<T> &x);
template <class T> void pr(const set<T> &x);
template <class T1, class T2> void pr(const map<T1, T2> &x);
template <class T> void pr(const T &x) { cout << x; }
template <class Arg, class... Args>
void pr(const Arg &first, const Args &... rest) {
  pr(first);
  pr(rest...);
}
template <class T1, class T2> void pr(const pair<T1, T2> &x) {
  pr("{", x.f, ", ", x.s, "}");
}
template <class T, bool pretty = true> void prContain(const T &x) {
  if (pretty)
    pr("{");
  bool fst = 1;
  for (const auto &a : x)
    pr(!fst ? pretty ? ", " : " " : "", a), fst = 0;
  if (pretty)
    pr("}");
}
template <class T> void pc(const T &x) {
  prContain<T, false>(x);
  pr("\n");
}
template <class T, size_t SZ> void pr(const array<T, SZ> &x) { prContain(x); }
template <class T> void pr(const vector<T> &x) { prContain(x); }
template <class T> void pr(const deque<T> &x) { prContain(x); }
template <class T> void pr(const set<T> &x) { prContain(x); }
template <class T1, class T2> void pr(const map<T1, T2> &x) { prContain(x); }
void ps() { pr("\n"); }
template <class Arg> void ps(const Arg &first) {
  pr(first);
  ps();
}
template <class Arg, class... Args>
void ps(const Arg &first, const Args &... rest) {
  pr(first, " ");
  ps(rest...);
}
} // namespace __output
using namespace __output;
#define TRACE(x) x
#define __pn(x) pr(#x, " = ")
#define pd(...) __pn((__VA_ARGS__)), ps(__VA_ARGS__), cout << flush
namespace __algorithm {
template <typename T> void dedup(vector<T> &v) {
  sort(all(v));
  v.erase(unique(all(v)), v.end());
}
template <typename T>
typename vector<T>::iterator find(vector<T> &v, const T &x) {
  auto it = lower_bound(all(v), x);
  return it != v.end() && *it == x ? it : v.end();
}
template <typename T> size_t index(vector<T> &v, const T &x) {
  auto it = find(v, x);
  assert(it != v.end() && *it == x);
  return it - v.begin();
}
template <typename C, typename T, typename OP>
vector<T> prefixes(const C &v, T id, OP op) {
  vector<T> r(sz(v) + 1, id);
  F0R(i, sz(v)) r[i + 1] = op(r[i], v[i]);
  return r;
}
template <typename C, typename T, typename OP>
vector<T> suffixes(const C &v, T id, OP op) {
  vector<T> r(sz(v) + 1, id);
  F0Rd(i, sz(v)) r[i] = op(v[i], r[i + 1]);
  return r;
}
} // namespace __algorithm
using namespace __algorithm;
struct monostate {
  friend istream &operator>>(istream &is,
                             const __attribute__((unused)) monostate &ms) {
    return is;
  }
  friend ostream &operator<<(ostream &os,
                             const __attribute__((unused)) monostate &ms) {
    return os;
  }
} ms;
template <typename W = monostate> struct wedge {
  int u, v, i;
  W w;
  wedge<W>(int _u = -1, int _v = -1, int _i = -1) : u(_u), v(_v), i(_i) {}
  int operator[](int loc) const { return u ^ v ^ loc; }
  friend void re(wedge &e) {
    re(e.u, e.v, e.w);
    --e.u, --e.v;
  }
  friend void pr(const wedge &e) { pr(e.u, "<-", e.w, "->", e.v); }
};
namespace __io {
void setIn(string s) { freopen(s.c_str(), "r", stdin); }
void setOut(string s) { freopen(s.c_str(), "w", stdout); }
void setIO(string s = "") {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(15);
  if (sz(s)) {
    setIn(s + ".in"), setOut(s + ".out");
  }
}
} // namespace __io
using namespace __io;
int main() {
  setIO();
  const int MAXV = 61;
  int N;
  re(N);
  vi a(N);
  re(a);
  vi pri;
  FOR(v, 2, MAXV) {
    bool ok = true;
    trav(p, pri) if (v % p == 0) ok = false;
    if (ok)
      pri.pb(v);
  }
  vi mask(MAXV);
  FOR(v, 1, MAXV) { F0R(i, sz(pri)) if (v % pri[i] == 0) mask[v] |= 1 << i; }
  vvpii dp(N + 1, vpii(1 << sz(pri), {INT_MAX, -1}));
  dp[0][0].f = -1;
  F0R(i, N) F0R(m, 1 << sz(pri)) if (dp[i][m].f < INT_MAX) {
    FOR(v, 1, MAXV) if (!(mask[v] & m)) {
      ckmin(dp[i + 1][m ^ mask[v]], mp(dp[i][m].f + abs(v - a[i]), v));
    }
  }
  vi b(N);
  int m = min_element(all(dp.back())) - dp.back().begin();
  F0Rd(i, N) {
    b[i] = dp[i + 1][m].s;
    m ^= mask[b[i]];
  }
  pc(b);
  return 0;
}

// XlSIowaTgBcjApbmgxTchTfGMaCIPosUXTLDKunlkocDQwoQCsXCDxDLFWxdkkinxgHgVePizIQegjNjkVTNFVrsACdRlHGFBhuBPHoHAnHWHRBgAaxQcmnRivWjBRmw


Comments

Submit
0 Comments
More Questions

1629A - Download More RAM
1629C - Meximum Array
1629D - Peculiar Movie Preferences
1629E - Grid Xor
1629F1 - Game on Sum (Easy Version)
2148. Count Elements With Strictly Smaller and Greater Elements
2149. Rearrange Array Elements by Sign
2150. Find All Lonely Numbers in the Array
2151. Maximum Good People Based on Statements
2144. Minimum Cost of Buying Candies With Discount
Non empty subsets
1630A - And Matching
1630B - Range and Partition
1630C - Paint the Middle
1630D - Flipping Range
1328A - Divisibility Problem
339A - Helpful Maths
4A - Watermelon
476A - Dreamoon and Stairs
1409A - Yet Another Two Integers Problem
977A - Wrong Subtraction
263A - Beautiful Matrix
180C - Letter
151A - Soft Drinking
1352A - Sum of Round Numbers
281A - Word Capitalization
1646A - Square Counting
266A - Stones on the Table
61A - Ultra-Fast Mathematician
148A - Insomnia cure